﻿package member;

import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import common.DBManager;

public class EditServlet extends HttpServlet {

	String mail = null;


//=============【『利用者検索結果』画面より受けとったパラメータで『利用者情報変更』画面を表示】======

	public void doGet(HttpServletRequest request,HttpServletResponse response)
			throws ServletException, IOException {

//　入力パラメータの文字エンコーディング
		request.setCharacterEncoding("UTF-8");

//　入力パラメータを取得
//　変更するレコードをidで指定
		String id = request.getParameter("id");

//　SQL文を記述
		String sql = "SELECT * FROM members WHERE ID = " + id;

		Connection con = null;
		Statement smt = null;

		try{
//　データベースを接続するためのConnectionオブジェクトを取得
//　SQLを発行するためのStatementオブジェクトを取得
			con = common.DBManager.getConnection();
			smt = con.createStatement();

//　StatementオブジェクトのexecuteUpdate()メソッドでSQLを発行(検索)
			ResultSet rs = smt.executeQuery( sql );

			MemberBean bean = new MemberBean();
			while(rs.next()){
				bean.setId(rs.getInt("id"));
				bean.setName(rs.getString("name"));
				bean.setRuby(rs.getString("ruby"));
				bean.setUserId(rs.getString("user_id"));
				bean.setPassword(rs.getString("password"));
			//　メールアドレスを保存(変更時の重複確認のため)
				mail = rs.getString("user_id");
			}

		//　リクエストスコープに"引数1"という名前で引数2の文字列を登録
			request.setAttribute("bean", bean);

		//　メールアドレスを保存
		//	mail = rs.getString("user_id");

		}catch( SQLException e ){

			throw new ServletException( e );

		}finally{

			if( smt != null ){

				try{
					smt.close();
				}catch( SQLException ignore ){
					//　何もしない
				}
			}
			if( con != null ){

				try{
					con.close();
				}catch( SQLException ignore ){
					//　何もしない
				}
			}
		}

//　JSPに画面遷移、フォワード
		request.getRequestDispatcher( "/member/userMemberEdit.jsp" ).forward(request, response);
	}


//=============【　正常処理　】『利用者情報変更』画面より受けとったパラメータで『利用者情報変更確認』画面を表示======
//=============【エラー発生時】『利用者情報変更』画面へ戻る======

	public void doPost(HttpServletRequest request,HttpServletResponse response)
			throws ServletException, IOException {

//　入力パラメータの文字エンコーディング
		request.setCharacterEncoding("UTF-8");

//　入力パラメータを取得
//　変更するレコードをidで指定
		String id = request.getParameter("id");
		String user_id = request.getParameter( "user_id" );
		String password = request.getParameter( "password" );
		String name = request.getParameter( "name" );
		String ruby = request.getParameter( "ruby" );

//　エラーメッセージを格納するArrayListの生成
		ArrayList<String> error_message = new ArrayList<String>();

//　エラーチェックのフラグ
		boolean error = false;

//　エラーのフィールドを赤く表示
		String error_user_id = null;
		String error_password = null;
		String error_name = null;
		String error_ruby = null;

//　遷移先のパス
		String path = null;

//----------【例外処理】----------

//　未入力の確認

		if((user_id == null || user_id.equals("")) ||
				(password == null || password.equals("")) ||
				(name == null || name.equals("")) ||
				(ruby == null || ruby.equals(""))){

			error_message.add("すべての項目を入力してください");
			error = true;

			if(user_id == null || user_id.equals("")){

				error_user_id = "error";
			}
			if(password == null || password.equals("")){

				error_password = "error";
			}
			if(name == null || name.equals("")){

				error_name = "error";
			}
			if(ruby == null || ruby.equals("")){

				error_ruby = "error";
			}
		}

//　メールアドレスのチェック
		if(!UserIdcheck(user_id)){
			//　利用者ＩＤの重複チェック
			error_message.add("入力されたメールアドレスはすでに利用されています");
			error = true;
			error_user_id = "error";
		}

		if(!Mailcheck(user_id)){
			error_message.add("メールアドレスは、半角で入力してください");
			error = true;
			error_user_id = "error";
		}

//　全角カナの確認（ruby）
		//　入力パターンを登録します
		Pattern pattern_ruby = Pattern.compile("^[ァ-ヶー]*$");;

		//　指定された入力とこのパターンをマッチする正規表現エンジンを作成
		Matcher matcher_ruby = pattern_ruby.matcher(ruby);
		//　入力された値が正規表現とマッチしているか調べる
		//　正規表現のパターンとマッチした場合にのみ true
		//　matches メソッドは、入力シーケンス全体とパターンをマッチする
		if( !matcher_ruby.matches() ){
			error_message.add("フリガナは、全角カタカナで入力してください");
			error = true;
			error_ruby = "error";
		}

//　パスワードのチェック
		if(!Passcheck(password)){
			//　パスワードの整合性チェック
			error_message.add("パスワードは、6桁以上10桁以下の半角英数字にしてください");
			error = true;
			error_password = "error";
		}

		if(!error){

//----------【例外なし正常処理】----------

			MemberBean bean2 = new MemberBean();
			bean2.setId(Integer.parseInt(id));
			bean2.setUserId(user_id);
			bean2.setPassword(password);
			bean2.setName(name);
			bean2.setRuby(ruby);

			request.setAttribute("bean", bean2);

			path = "/member/userMemberEditCheck.jsp";

		}else{

//----------【例外処理】----------

			MemberBean bean = new MemberBean();
			bean.setId(Integer.parseInt(id));
			bean.setUserId(user_id);
			bean.setPassword(password);
			bean.setName(name);
			bean.setRuby(ruby);

			request.setAttribute("bean", bean);

			//　リクエストスコープに"引数1"という名前で引数2の文字列を登録
			request.setAttribute( "error_message" , error_message );
			request.setAttribute( "error_user_id" , error_user_id );
			request.setAttribute( "error_password" , error_password );
			request.setAttribute( "error_name" , error_name );
			request.setAttribute( "error_ruby" , error_ruby );;

			path = "/member/userMemberEdit.jsp";
		}

//　JSPに画面遷移、フォワード
		RequestDispatcher dispatcher = request.getRequestDispatcher( path );
		dispatcher.forward(request, response);
	}

//　パスワードの整合性の識別　　パスワードは半角英数字のみなのでそれ以外の時はNG
	private boolean Passcheck(String pass){

		boolean check = true;

		char[] chars = pass.toCharArray();
		 	if(chars.length < 6 || chars.length > 10){
		 		check = false;
		 	}else{
			    for (int i = 0; i < chars.length; i++) {
			         char c = chars[i];
			         if ((c <= '\u007e') || // 英数字
			        	                (c == '\u00a5') || // \記号
			        	                (c == '\u203e') || // ~記号
			        	               (c >= '\uff61' && c <= '\uff9f') // 半角カナ
			 	        ) {

			         } else {
			        	             check = false;
			        	             break ;
			         }
			    }
		 	}
		return check;
	}

//　メールアドレスは半角英数字のみなのでそれ以外の時はNG
	private boolean Mailcheck(String user_id){

		boolean check = true;

		 char[] chars = user_id.toCharArray();
	    for (int i = 0; i < chars.length; i++) {
	         char c = chars[i];
	         if ((c <= '\u007e') || // 英数字
	        	                (c == '\u00a5') || // \記号
	        	                (c == '\u203e') || // ~記号
	        	               (c >= '\uff61' && c <= '\uff9f') // 半角カナ
	 	        ) {  } else {
	        	             check = false;
	        	             break ;
	         }
		}
		return check;
	}

	Statement smt  = null;
	Connection con = null;

//　メールアドレスの重複チェック
	private boolean UserIdcheck(String user_id){
		boolean check = true;

		if(user_id.equals(mail)){

		}else{
			//　入力された利用者IDと同じIDのものを検索する
			String sql = "select count(*) as cnt from members where USER_ID = '"+user_id + "'";

			try {

				con = DBManager.getConnection();
				smt  = con.createStatement();

				ResultSet rs   = smt.executeQuery(sql);

				if(rs.next()){
					int coung = rs.getInt("cnt");
					if(coung > 0)
					check = false;
				}

			}catch (SQLException e){

			}finally{
				if(smt != null){try{smt.close();}catch(SQLException ignore){}}
				if(con != null){try{con.close();}catch(SQLException ignore){}}
			}
		}
		return check;
	}
}
